<?php

namespace common\models\system;

use common\core\BaseActiveRecord;
use Yii;
use yii\behaviors\TimestampBehavior;

/**
 * This is the model class for table "{{%config}}".
 *
 * @property int $id 配置ID
 * @property string $name 配置名称
 * @property string $title 配置说明
 * @property int $group 配置分组
 * @property int $type 配置类型
 * @property string $value 配置值
 * @property string $extra 选项值
 * @property string $remark 配置说明
 * @property int $sort 排序
 * @property int $status 状态
 * @property int $created_at 创建时间
 * @property int $updated_at 更新时间
 */
class Config extends BaseActiveRecord
{
    // 状态
    const STATUS_正常 = 1;
    const STATUS_隐藏 = -1;

    // 类型
    const TYPE_数字 = 0;
    const TYPE_字符 = 1;
    const TYPE_文本 = 2;
    const TYPE_数组 = 3;
    const TYPE_枚举 = 4;

    // 分组
     const GROUP_不分组 = 0;
     const GROUP_基本 = 1;
     const GROUP_内容 = 2;
     const GROUP_用户 = 3;
     const GROUP_系统 = 4;

    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return '{{%config}}';
    }

    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            [
                'class' => TimestampBehavior::className(),
                'createdAtAttribute' => 'created_at',
                'updatedAtAttribute' => 'updated_at',
                'value' => time(),
            ],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['group', 'type', 'sort', 'status', 'created_at', 'updated_at'], 'integer'],
            [['value'], 'string'],
            [['name'], 'string', 'max' => 30],
            [['title'], 'string', 'max' => 50],
            [['extra'], 'string', 'max' => 255],
            [['remark'], 'string', 'max' => 100],
            [['name'], 'unique'],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => '配置ID',
            'name' => '配置名称',
            'title' => '配置说明',
            'group' => '配置分组',
            'type' => '配置类型',
            'value' => '配置值',
            'extra' => '选项值',
            'remark' => '配置说明',
            'sort' => '排序',
            'status' => '状态',
            'created_at' => '创建时间',
            'updated_at' => '更新时间',
        ];
    }

    /**
     * 状态字典
     * @param null $index
     * @return array|mixed
     */
    public static function getStatus($index = null) {
        $map = [
            self::STATUS_正常 => '正常',
            self::STATUS_隐藏 => '隐藏',
        ];

        return ($index === null) ? $map : (isset($map[$index]) ? $map[$index] : '未知');
    }

    /**
     * 类型字典
     * @param null $index
     * @return array|mixed
     */
    public static function getType($index = null) {
        $map = [
            self::TYPE_数字 => '数字',
            self::TYPE_字符 => '字符',
            self::TYPE_文本 => '文本',
            self::TYPE_数组 => '数组',
            self::TYPE_枚举 => '枚举',
        ];

        return ($index === null) ? $map : (isset($map[$index]) ? $map[$index] : '未知');
    }

    /**
     * 分组字典
     * @param null $index
     * @return array|mixed
     */
    public static function getGroup($index = null) {
        $map = [
            self::GROUP_不分组 => '不分组',
            self::GROUP_基本 => '基本',
            self::GROUP_内容 => '内容',
            self::GROUP_用户 => '用户',
            self::GROUP_系统 => '系统',
        ];

        return ($index === null) ? $map : (isset($map[$index]) ? $map[$index] : '未知');
    }

    /**
     * ---------------------------------------
     * 根据配置类型解析配置
     * @param  integer $type  配置类型
     * @param  string  $value 配置值
     * @return mixed
     * ---------------------------------------
     */
    public static function parse($type, $value){
        switch ($type) {
            case 3: //解析数组
                $array = preg_split('/[,;\r\n]+/', trim($value, ",;\r\n"));
                if(strpos($value,':')){
                    $value  = [];
                    foreach ($array as $val) {
                        list($k, $v) = explode(':', $val);
                        $value[$k]   = $v;
                    }
                }else{
                    $value =    $array;
                }
                break;
        }
        return $value;
    }
}
